/*
  Copyright (c), 2001-2022, Shenshu Tech. Co., Ltd.
 */

#ifndef OT_COMMON_REGION_H
#define OT_COMMON_REGION_H

#include "ot_common.h"
#include "ot_common_video.h"
#include "ot_defines.h"
#include "ot_errno.h"

#define OT_RGN_MAX_BMP_UPDATE_NUM 16
#define OT_RGN_BATCH_HANDLE_MAX 24
#define OT_RGN_QUAD_POINT_NUM 4
#define OT_RGN_LINE_POINT_NUM 2
#define OT_RGN_CLUT_NUM 16
typedef td_u32 ot_rgn_handle;
typedef td_u32 ot_rgn_handle_grp;

/* type of video regions */
typedef enum
{
    OT_RGN_OVERLAY = 0,
    OT_RGN_COVER,
    OT_RGN_OVERLAYEX,
    OT_RGN_COVEREX,
    OT_RGN_LINEEX,
    OT_RGN_MOSAIC,
    OT_RGN_MOSAICEX,
    OT_RGN_CORNER_RECT,
    OT_RGN_CORNER_RECTEX,
    OT_RGN_BUTT
} ot_rgn_type;

typedef enum
{
    OT_RGN_ATTACH_JPEG_MAIN = 0,
    OT_RGN_ATTACH_JPEG_MPF0,
    OT_RGN_ATTACH_JPEG_MPF1,
    OT_RGN_ATTACH_JPEG_BUTT
} ot_rgn_attach_dst;

typedef struct
{
    td_bool enable;
    td_bool is_abs_qp;
    td_s32 qp_val;
} ot_rgn_overlay_qp_info;

typedef struct
{
    ot_pixel_format pixel_format; /* bitmap pixel format now support clut2 and clut4 */
    td_u32 bg_color;              /* background color, pixel format depends on "pixel_format" */
    /*
     * region size, width:[2, OT_RGN_OVERLAY_MAX_WIDTH], align:2,
     * height:[2, OT_RGN_OVERLAY_MAX_HEIGHT], align:2
     */
    ot_size size;
    td_u32 canvas_num;
    td_u32 clut[OT_RGN_CLUT_NUM]; /* color look up table */
} ot_rgn_overlay_attr;

typedef struct
{
    /*
     * x:[0, OT_RGN_OVERLAY_MAX_X], align:2,
     * y:[0, OT_RGN_OVERLAY_MAX_Y], align:2
     */
    ot_point point;
    td_u32 fg_alpha;
    td_u32 bg_alpha;
    td_u32 layer; /* OVERLAY region layer range depends on OVERLAY max num */
    ot_rgn_overlay_qp_info qp_info;
    ot_rgn_attach_dst dst;
} ot_rgn_overlay_chn_attr;

typedef struct
{
    ot_pixel_format pixel_format;
    td_u32 bg_color; /* background color, pixel format depends on "pixel_format" */
    /*
     * region size, width:[2, OT_RGN_OVERLAY_MAX_WIDTH], align:2,
     * height:[2, OT_RGN_OVERLAY_MAX_HEIGHT], align:2
     */
    ot_size size;
    td_u32 canvas_num;
    td_u32 clut[OT_RGN_CLUT_NUM];
} ot_rgn_overlayex_attr;

typedef struct
{
    /*
     * x:[0, OT_RGN_OVERLAYEX_MAX_X], align:2,
     * y:[0, OT_RGN_OVERLAYEX_MAX_Y], align:2
     */
    ot_point point;
    td_u32 fg_alpha;
    td_u32 bg_alpha;
    td_u32 layer; /* OVERLAYEX region layer range depends on OVERLAYEX max num */
} ot_rgn_overlayex_chn_attr;

typedef struct
{
    ot_cover cover;
    td_u32 layer;   /* COVER region layer range depends on COVER max num */
    ot_coord coord; /* ratio coordinate or abs coordinate */
} ot_rgn_cover_chn_attr;

typedef struct
{
    ot_cover coverex;
    td_u32 layer;   /* COVEREX region layer range depends on COVEREX max num */
    ot_coord coord; /* ratio coordinate or abs coordinate */
} ot_rgn_coverex_chn_attr;

typedef struct
{
    ot_rect rect;                /* location of MOSAIC */
    ot_mosaic_blk_size blk_size; /* block size of MOSAIC */
    td_u32 layer;                /* MOSAIC region layer range depends on MOSAIC max num */
} ot_rgn_mosaic_chn_attr;

typedef struct
{
    ot_rect rect;                /* location of MOSAICEX */
    ot_mosaic_blk_size blk_size; /* block size of MOSAIC EX */
    td_u32 layer;                /* MOSAICEX region layer range depends on MOSAICEX max num */
} ot_rgn_mosaicex_chn_attr;

typedef union
{
    ot_rgn_overlay_attr overlay;     /* attribute of overlay region.
                                        AUTO:ot_rgn_type:OT_RGN_OVERLAY; */
    ot_rgn_overlayex_attr overlayex; /* attribute of overlayex region.
                                        AUTO:ot_rgn_type:OT_RGN_OVERLAYEX; */
} ot_rgn_type_attr;

typedef struct
{
    /* width of line range[OT_RGN_LINEEX_MIN_THICK, OT_RGN_LINEEX_MAX_THICK] */
    td_u32 thick;
    td_u32 color;                           /* color of line range [0, 0xffffff] */
    ot_point points[OT_RGN_LINE_POINT_NUM]; /* startpoint and endpoint of line */
} ot_rgn_lineex_chn_attr;

typedef struct
{
    ot_corner_rect corner_rect;           /* location and size of corner rect */
    ot_corner_rect_attr corner_rect_attr; /* attribute of corner rect region */
    td_u32 layer; /* CORNER_RECT region layer range depends on CORNER_RECT max num */
} ot_rgn_corner_rectex_chn_attr;

typedef struct
{
    ot_corner_rect corner_rect;           /* location and size of corner rect */
    ot_corner_rect_attr corner_rect_attr; /* attribute of corner rect region */
    td_u32 layer; /* CORNER_RECT region layer range depends on CORNER_RECT max num */
} ot_rgn_corner_rect_chn_attr;

typedef union
{
    ot_rgn_overlay_chn_attr overlay_chn;     /* attribute of overlay region.
                                                AUTO:ot_rgn_type:OT_RGN_OVERLAY; */
    ot_rgn_cover_chn_attr cover_chn;         /* attribute of cover region.
                                                AUTO:ot_rgn_type: OT_RGN_COVER; */
    ot_rgn_overlayex_chn_attr overlayex_chn; /* attribute of overlayex region. AUTO:ot_rgn_type:
                                                OT_RGN_OVERLAYEX; */
    ot_rgn_coverex_chn_attr coverex_chn;     /* attribute of coverex region.
                                                AUTO:ot_rgn_type:OT_RGN_COVEREX; */
    ot_rgn_lineex_chn_attr lineex_chn;       /* attribute of line region.
                                                AUTO:ot_rgn_type:OT_RGN_LINEEX; */
    ot_rgn_mosaic_chn_attr mosaic_chn;       /* attribute of mosaic region.
                                                AUTO:ot_rgn_type:OT_RGN_MOSAIC; */
    ot_rgn_mosaicex_chn_attr mosaicex_chn;   /* attribute of mosaicex region.
                                                AUTO:ot_rgn_type:OT_RGN_MOSAICEX; */
    /*
     * attribute of corner rect region.
     * AUTO:ot_rgn_type:OT_RGN_CORNER_RECT;
     */
    ot_rgn_corner_rect_chn_attr corner_rect_chn;
    /*
     * attribute of corner rectex region.
     * AUTO:ot_rgn_type:OT_RGN_CORNER_RECTEX;
     */
    ot_rgn_corner_rectex_chn_attr corner_rectex_chn;
} ot_rgn_type_chn_attr;

/* attribute of a region */
typedef struct
{
    ot_rgn_type type;
    ot_rgn_type_attr attr; /* region attribute */
} ot_rgn_attr;

/* attribute of a region */
typedef struct
{
    td_bool is_show;
    ot_rgn_type type;
    ot_rgn_type_chn_attr attr; /* region attribute */
} ot_rgn_chn_attr;

typedef struct
{
    td_phys_addr_t phys_addr;
    ot_size size;
    td_u32 stride;
    ot_pixel_format pixel_format;
    td_void ATTRIBUTE *virt_addr;
} ot_rgn_canvas_info;

/* invalid device ID */
#define OT_ERR_RGN_INVALID_DEV_ID \
    OT_DEFINE_ERR(OT_ID_RGN, OT_ERR_LEVEL_ERROR, OT_ERR_INVALID_DEV_ID)
/* invalid channel ID */
#define OT_ERR_RGN_INVALID_CHN_ID \
    OT_DEFINE_ERR(OT_ID_RGN, OT_ERR_LEVEL_ERROR, OT_ERR_INVALID_CHN_ID)
/* at least one parameter is illegal, e.g. an illegal enumeration value */
#define OT_ERR_RGN_ILLEGAL_PARAM OT_DEFINE_ERR(OT_ID_RGN, OT_ERR_LEVEL_ERROR, OT_ERR_ILLEGAL_PARAM)
/* channel exists */
#define OT_ERR_RGN_EXIST OT_DEFINE_ERR(OT_ID_RGN, OT_ERR_LEVEL_ERROR, OT_ERR_EXIST)
/* not exist */
#define OT_ERR_RGN_UNEXIST OT_DEFINE_ERR(OT_ID_RGN, OT_ERR_LEVEL_ERROR, OT_ERR_UNEXIST)
/* using a NULL pointer */
#define OT_ERR_RGN_NULL_PTR OT_DEFINE_ERR(OT_ID_RGN, OT_ERR_LEVEL_ERROR, OT_ERR_NULL_PTR)
/* try to enable or initialize system, device or channel, before configuring
 * attribute */
#define OT_ERR_RGN_NOT_CFG OT_DEFINE_ERR(OT_ID_RGN, OT_ERR_LEVEL_ERROR, OT_ERR_NOT_CFG)
/* operation is not supported */
#define OT_ERR_RGN_NOT_SUPPORT OT_DEFINE_ERR(OT_ID_RGN, OT_ERR_LEVEL_ERROR, OT_ERR_NOT_SUPPORT)
/* operation is not permitted, e.g. try to change static attribute */
#define OT_ERR_RGN_NOT_PERM OT_DEFINE_ERR(OT_ID_RGN, OT_ERR_LEVEL_ERROR, OT_ERR_NOT_PERM)
/* failure caused by malloc memory */
#define OT_ERR_RGN_NO_MEM OT_DEFINE_ERR(OT_ID_RGN, OT_ERR_LEVEL_ERROR, OT_ERR_NO_MEM)
/* failure caused by malloc buffer */
#define OT_ERR_RGN_NO_BUF OT_DEFINE_ERR(OT_ID_RGN, OT_ERR_LEVEL_ERROR, OT_ERR_NO_BUF)
/* no data in buffer */
#define OT_ERR_RGN_BUF_EMPTY OT_DEFINE_ERR(OT_ID_RGN, OT_ERR_LEVEL_ERROR, OT_ERR_BUF_EMPTY)
/* no buffer for new data */
#define OT_ERR_RGN_BUF_FULL OT_DEFINE_ERR(OT_ID_RGN, OT_ERR_LEVEL_ERROR, OT_ERR_BUF_FULL)
/* bad address, e.g. used for copy_from_user & copy_to_user */
#define OT_ERR_RGN_BAD_ADDR OT_DEFINE_ERR(OT_ID_RGN, OT_ERR_LEVEL_ERROR, OT_ERR_BAD_ADDR)
/* resource is busy, e.g. destroy a venc chn without unregistering it */
#define OT_ERR_RGN_BUSY OT_DEFINE_ERR(OT_ID_RGN, OT_ERR_LEVEL_ERROR, OT_ERR_BUSY)
/*
 * System is not ready, maybe not initialized or loaded.
 * Returning the error code when opening a device file failed.
 */
#define OT_ERR_RGN_NOT_READY OT_DEFINE_ERR(OT_ID_RGN, OT_ERR_LEVEL_ERROR, OT_ERR_NOT_READY)

#endif /* OT_COMMON_REGION_H */
